home *** CD-ROM | disk | FTP | other *** search
-
- Title: How to use functions in VER.DLL -- a Sample Application
- Document Number: Q112731 Publ Date: 25-APR-1994
- Product Name: Microsoft Visual Basic
- Product Version: 2.00 3.00
- Operating System: WINDOWS
-
-
-
- ------------------------------------------------------------------
- The information in this article applies to:
-
-
- - Standard and Professional Editions of Microsoft Visual Basic
- for Windows, versions 2.0 and 3.0
- ------------------------------------------------------------------
-
-
- SUMMARY
- =======
-
-
- This article contains code and instructions that show you how to
- create a sample application that uses some of the functions in VER.DLL
- to retrieve file information embedded into a file with the resource
- compiler (RC.EXE).
-
-
- This Visual Basic applicatin was modeled after the Verstamp sample
- program included in the Microsoft Windows Software Development Kit (SDK).
-
-
- Additional information can be found in the following documents:
-
-
- - Microsoft Windows 3.1 Programmer's Reference, Vols. 2 & 3
- - Microsoft SDK Reference Help File (WIN31WH.HLP) from Windows 3.1 SDK
- or the Professional Edition of Visual Basic version 2.0 or 3.0.
-
-
- MORE INFORMATION
- ================
-
-
- Instead of offering this article in a number of steps, we have modified
- our usual format to make it easier for you to create and use this Visual
- Basic application. Therefore, the three files you need (VERINFO.BAS,
- VERINFO1.FRM, VERINFO2.FRM) are listed below so you can easily copy them
- into a text editor and save them as separate files. Instructions for how
- to use the files are embedded in the files as comments.
-
-
- VERINFO.BAS
- -----------
-
-
- ' Place the following code in a single text file called VERINFO.BAS
- '
- ' The Global constants below are defined in the VER.H header file, also
- ' included in Microsoft C/C++ 7.0, and the Windows SDK.
- '
- ' NOTE: After copying this into a file in a text editor, modify each
- ' Declare statements so that each one uses only one, single line.
-
-
- Type VS_VERSION
- wLength As Integer
- wValueLength As Integer
- szKey As String * 16 ' "VS_VERSION_INFO"
- dwSignature As Long ' VS_FIXEDFILEINFO struct
- dwStrucVersion As Long
- dwFileVersionMS As Long
- dwFileVersionLS As Long
- dwProductVersionMS As Long
- dwProductVersionLS As Long
- dwFileFlagsMasks As Long
- dwFileFlags As Long
- dwFileOS As Long
- dwFileType As Long
- dwFileSubType As Long
- dwFileDateMS As Long
- dwFileDateLS As Long
- End Type
-
-
- Declare Function GetFileVersionInfo% Lib "Ver.dll" (ByVal Filename$,
- ByVal dwhandle&, ByVal cbBuff&, ByVal lpvData$)
- Declare Function GetFileVersionInfoSize& Lib "Ver.dll"
- (ByVal Filename$, dwhandle&)
- Declare Sub hmemcpy Lib "kernel" (hpvDest As Any, hpvSrc As Any,
- ByVal cbBytes&)
- Declare Function GetSystemDirectory% Lib "kernel"
- (ByVal Path$, ByVal cbBytes%)
-
-
- ' **** VS_VERSION.dwFileFlags ****
- Global Const VS_FF_DEBUG = &H1&
- Global Const VS_FF_PRERELEASE = &H2&
- Global Const VS_FF_PATCHED = &H4&
- Global Const VS_FF_PRIVATEBUILD = &H8&
- Global Const VS_FF_INFOINFERRED = &H10&
- Global Const VS_FF_SPECIALBUILD = &H20&
-
-
- ' **** VS_VERSION.dwFileOS ****
- Global Const VOS_UNKNOWN = &H0&
- Global Const VOS_DOS = &H10000
- Global Const VOS_OS216 = &H20000
- Global Const VOS_OS232 = &H30000
- Global Const VOS_NT = &H40000
-
-
- Global Const VOS__BASE = &H0&
- Global Const VOS__WINDOWS16 = &H1&
- Global Const VOS__PM16 = &H2&
- Global Const VOS__PM32 = &H3&
- Global Const VOS__WINDOWS32 = &H4&
-
-
- Global Const VOS_DOS_WINDOWS16 = &H10001
- Global Const VOS_DOS_WINDOWS32 = &H10004
- Global Const VOS_OS216_PM16 = &H20002
- Global Const VOS_OS232_PM32 = &H30003
- Global Const VOS_NT_WINDOWS32 = &H40004
-
-
- ' **** VS_VERSION.dwFileType ****
- Global Const VFT_UNKNOWN = &H0&
- Global Const VFT_APP = &H1&
- Global Const VFT_DLL = &H2&
- Global Const VFT_DRV = &H3&
- Global Const VFT_FONT = &H4&
- Global Const VFT_VXD = &H5&
- Global Const VFT_STATIC_LIB = &H7&
-
-
- ' **** VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ****
- Global Const VFT2_UNKNOWN = &H0&
- Global Const VFT2_DRV_PRINTER = &H1&
- Global Const VFT2_DRV_KEYBOARD = &H2&
- Global Const VFT2_DRV_LANGUAGE = &H3&
- Global Const VFT2_DRV_DISPLAY = &H4&
- Global Const VFT2_DRV_MOUSE = &H5&
- Global Const VFT2_DRV_NETWORK = &H6&
- Global Const VFT2_DRV_SYSTEM = &H7&
- Global Const VFT2_DRV_INSTALLABLE = &H8&
- Global Const VFT2_DRV_SOUND = &H9&
- Global Const VFT2_DRV_COMM = &HA&
-
-
- ' **** VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ****
- Global Const VFT2_FONT_RASTER = &H1&
- Global Const VFT2_FONT_VECTOR = &H2&
- Global Const VFT2_FONT_TRUETYPE = &H3&
-
-
- ' **** Global variables used in both forms ****
- Global Filename$
- Global Directory$
- Global FileVer$
- Global ProdVer$
- Global FileFlags$
- Global FileOS$
- Global FileType$
- Global FileSubType$
-
-
- VERINFO1.FRM
- ------------
-
-
- ' The following is a text dump of the form VERINFO1. It includes the form
- ' and control description as well as necessary Function and Sub procedures.
- ' Save the code in a single TEXT file called VERINFO1.FRM and you will
- ' be able to load it as a form in Visual Basic.
- '
- ' NOTE: To make the code fit in this article, some of the lines are listed
- ' using multiple lines. After copying the code into a file in a text editor
- ' modify it to ensure that all lines of code exist as one, single line
- ' in the file. Otherwise, you will receive errors when loading the form in
- ' Visual Basic.
-
-
- Begin Form Form1
- BorderStyle = 1 'Fixed Single
- Caption = "VerInfo Demo"
- ClientHeight = 4290
- ClientLeft = 2340
- ClientTop = 2160
- ClientWidth = 3855
- Height = 4695
- Left = 2280
- LinkMode = 1 'Source
- LinkTopic = "Form1"
- ScaleHeight = 17.875
- ScaleMode = 4 'Character
- ScaleWidth = 32.125
- Top = 1815
- Width = 3975
- Begin DriveListBox Drive1
- Height = 288
- Left = 1836
- TabIndex = 7
- Top = 3792
- Width = 1908
- End
- Begin DirListBox Dir1
- Height = 1884
- Left = 1830
- TabIndex = 5
- Top = 1428
- Width = 1896
- End
- Begin FileListBox File1
- Height = 2955
- Left = 120
- TabIndex = 3
- Top = 984
- Width = 1575
- End
- Begin TextBox Text1
- Height = 288
- Left = 1092
- TabIndex = 1
- Text = "*.*"
- Top = 204
- Width = 2544
- End
- Begin Label Label1
- Caption = "Dri&ves:"
- Height = 216
- Index = 4
- Left = 1830
- TabIndex = 6
- Top = 3480
- Width = 660
- End
- Begin Label Label1
- Caption = "&Directories:"
- Height = 192
- Index = 3
- Left = 1830
- TabIndex = 4
- Top = 1104
- Width = 1236
- End
- Begin Label Label1
- Caption = "c:\"
- Height = 204
- Index = 2
- Left = 1830
- TabIndex = 8
- Top = 648
- Width = 1884
- End
- Begin Label Label1
- Caption = "&Files:"
- Height = 204
- Index = 0
- Left = 120
- TabIndex = 2
- Top = 648
- Width = 612
- End
- Begin Label Label1
- Caption = "File&Name:"
- Height = 204
- Index = 1
- Left = 120
- TabIndex = 0
- Top = 252
- Width = 936
- End
- End
-
-
- Sub Dir1_Change ()
- File1.Path = Dir1.Path
- Label1(2).Caption = File1.Path
- End Sub
-
- b Sub DisplayVerInfo ()
- Dim X As VS_VERSION
-
-
- '*** Get Version Info ****
- FileVer$ = "": ProdVer$ = "": FileFlags$ = ""
- FileOS$ = "": FileType$ = "": FileSubType$ = ""
- FileName$ = File1.List(File1.ListIndex)
- Directory$ = Label1(2).Caption
- FullFileName$ = Label1(2).Caption + "\" + FileName$
- BufSize& = GetFileVersionInfoSize(FullFileName$, dwHandle&)
- If BufSize& = 0 Then
- MsgBox "No Version Info available!"
- Exit Sub
- End If
- lpvData$ = Space$(BufSize&)
- r% = GetFileVersionInfo(FullFileName$, dwHandle&, BufSize&, lpvData$)
- hmemcpy X, ByVal lpvData$, Len(X)
-
-
- '**** Determine File Version number ****
- FileVer$ = LTrim$(Str$(HIWORD(X.dwFileVersionMS))) + "."
- FileVer$ = FileVer$ + LTrim$(Str$(LOWORD(X.dwFileVersionMS))) + "."
- FileVer$ = FileVer$ + LTrim$(Str$(HIWORD(X.dwFileVersionLS))) + "."
- FileVer$ = FileVer$ + LTrim$(Str$(LOWORD(X.dwFileVersionLS)))
-
-
- '**** Determine Product Version number ****
- ProdVer$ = LTrim$(Str$(HIWORD(X.dwFileVersionMS))) + "."
- ProdVer$ = ProdVer$ + LTrim$(Str$(LOWORD(X.dwProductVersionMS))) + "."
- ProdVer$ = ProdVer$ + LTrim$(Str$(HIWORD(X.dwProductVersionLS))) + "."
- ProdVer$ = ProdVer$ + LTrim$(Str$(LOWORD(X.dwProductVersionLS)))
-
-
- '**** Determine Boolean attributes of File ****
- If X.dwFileFlags And VS_FF_DEBUG Then FileFlags$ = "DeBug"
- If X.dwFileFlags And VS_FF_PRERELEASE Then FileFlags$ =
- FileFlags$ + "PreRel"
- If X.dwFileFlags And VS_FF_PATCHED Then FileFlags$ =
- FileFlags$ + "Patched"
- If X.dwFileFlags And VS_FF_PRIVATEBUILD Then FileFlags$ =
- FileFlags$ + "Private"
- If X.dwFileFlags And VS_FF_INFOINFERRED Then FileFlags$ =
- FileFlags$ + "Info"
- If X.dwFileFlags And VS_FF_DEBUG Then FileFlags$ =
- FileFlags$ + "Special"
-
-
- If X.dwFileFlags And &HFFFFFF00 Then FileFlags$ = FileFlags$ + "Unknown"
-
-
- '**** Determine OS for which file was designed ****
- Select Case X.dwFileOS
- Case VOS_DOS_WINDOWS16
- FileOS$ = "DOS-Win16"
- Case VOS_DOS_WINDOWS32
- FileOS$ = "DOS=Win32"
- Case VOS_OS216_PM16
- FileOS$ = "OS/2-16 PM-16"
- Case VOS_OS232_PM32
- FileOS$ = "OS/2-32 PM-32"
- Case VOS_NT_WINDOWS32
- FileOS$ = "NT-Win32" b Case Else
- FileOS$ = "Unknown"
- End Select
-
-
-
- '**** Determine Type and SubType of File ****
- Select Case X.dwFileType
- Case VFT_APP
- FileType$ = "App"
- Case VFT_DLL
- FileType$ = "DLL"
- Case VFT_DRV
- FileType$ = "Driver"
- Select Case X.dwFileSubType
- Case VFT2_DRV_PRINTER
- FileSubType$ = "Printer drv"
- Case VFT2_DRV_KEYBOARD
- FileSubType$ = "Keyboard drv"
- Case VFT2_DRV_LANGUAGE
- FileSubType$ = "Language drv"
- Case VFT2_DRV_DISPLAY
- FileSubType$ = "Display drv"
- Case VFT2_DRV_MOUSE
- FileSubType$ = "Mouse drv"
- Case VFT2_DRV_NETWORK
- FileSubType$ = "Network drv"
- ALLABLE
- FileSubType$ = "Installable"
- Case VFT2_DRV_SOUND
- FileSubType$ = "Sound drv"
- Case VFT2_DRV_COMM
- FileSubType$ = "Comm drv"
- Case VFT2_UNKNOWN
- FileSubType$ = "Unknown"
- End Select
- Case VFT_FONT
- FileType$ = "Font"
- Select Case X.dwFileSubType
- Case VFT_FONT_RASTER
- FileSubType$ = "Raster Font"
- Case VFT_FONT_VECTOR
- FileSubType$ = "Vector Font"
- Case VFT_FONT_TRUETYPE
- FileSubType$ = "TrueType Font"
- End Select
- Case VFT_VXD
- FileType$ = "VxD"
- Case VFT_STATIC_LIB
- FileType$ = "Lib"
- Case Else
- FileType$ = "Unknown"
- End Select
-
-
- Form2.Show 1
- End Sub
-
-
- Sub Drive1_Change ()
- Dir1.Path = Drive1.Drive
- File1.Path = Dir1.Path
- Label1(2).Caption = File1.Path
- End Sub
-
-
- Sub File1_Click ()
- Text1.Text = File1.List(File1.ListIndex)
- End Sub
-
-
- Sub File1_DblClick ()
- DisplayVerInfo
- End Sub
-
-
- Sub File1_PathChange ()
- Text1.Text = "*.*"
- File1.Pattern = "*.*"
- End Sub
-
-
- Sub Form_Load ()
- Dim Buffer$
-
-
- ' **** Set Default Dir to Windows System Subdirectory ****
- Buffer$ = Space$(256)
- r% = GetSystemDirectory(Buffer$, Len(Buffer$))
- Dir1.Path = Buffer$
- File1.Path = Buffer$
- Drive1.Drive = Left$(Buffer$, 1)
- End Sub
-
-
- Function HIWORD (X As Long) As Integer
- HIWORD = X \ &HFFFF&
- End Function
-
-
- Function LOWORD (X As Long) As Integer
- LOWORD = X And &HFFFF&
- End Function
-
-
- Sub Text1_KeyPress (KeyAscii As Integer)
- If KeyAscii = 13 Then
- File1.Pattern = Text1.Text
- KeyAscii = 0
- If File1.ListCount = 1 Then DisplayVerInfo
- If File1.ListCount = 0 Then
- MsgBox "Invalid Filename"
- File1.Pattern = "*.*"
- Text1.Text = "*.*"
- End If
- File1.SetFocus
- End If
- End Sub
-
-
-
- VERINFO2.FRM
- ------------
-
-
- ' The following is a text dump of the form VERINFO2. It includes the form
- ' and control description as well as necessary Function and Sub procedures.
- ' Save the code in a single text file called VERINFO2.FRM and you will
- ' be able to load it as a form in Visual Basic.
- '
- VERSION 2.00
- Begin Form Form2
- BorderStyle = 1 'Fixed Single
- Caption = "File Version Info"
- ClientHeight = 3345
- ClientLeft = 6630
- ClientTop = 2175
- ClientWidth = 4500
- FontBold = 0 'False
- FontItalic = 0 'False
- FontName = "MS Sans Serif"
- FontSize = 8.25
- FontStrikethru = 0 'False
- FontUnderline = 0 'False
- Height = 3750
- Left = 6570
- LinkMode = 1 'Source
- LinkTopic = "Form3"
- MaxButton = 0 'False
- MinButton = 0 'False
- ScaleHeight = 13.938
- ScaleMode = 4 'Character
- ScaleWidth = 37.5
- Top = 1830
- Width = 4620
- Begin CommandButton Command1
- Caption = "OK"
- Height = 372
- Left = 1680
- TabIndex = 0
- Top = 2880
- Width = 1452
- End
- End
-
-
- Sub Command1_Click ()
- Form2.Hide
- End Sub
-
-
- Sub Command1_GotFocus ()
- Form_Paint
- End Sub
-
-
- Sub Form_Paint ()
- Form2.CurrentX = 2
- Form2.CurrentY = 1
- Form2.Print "FileName:"
- Form2.CurrentX = 2
- Form2.Print "Directory:"
- Form2.CurrentX = 2
- Form2.Print "File Version:"
- Form2.CurrentX = 2
- Form2.Print "Product Version:"
- Form2.CurrentX = 2
- Form2.Print "File Flags:"
- Form2.CurrentX = 2
- Form2.Print "File OS:"
- Form2.CurrentX = 2
- Form2.Print "File Type:"
- Form2.CurrentX = 2
- Form2.Print "File Sub-type:"
-
-
- Form2.CurrentX = 18
- Form2.CurrentY = 1
- Form2.Print FileName$
- Form2.CurrentX = 18
- Form2.Print Directory$
- Form2.CurrentX = 18
- Form2.Print FileVer$
- Form2.CurrentX = 18
- Form2.Print ProdVer$
- Form2.CurrentX = 18
- Form2.Print FileFlags$
- Form2.CurrentX = 18
- Form2.Print FileOS$
- Form2.CurrentX = 18
- Form2.Print FileType$
- Form2.CurrentX = 18
- Form2.Print FileSubType$
- End Sub
-
-
- How to Create and Run the Program
- ---------------------------------
-
-
- 1. Start Visual Basic. Form1 is created by default.
-
-
- 2. From the File menu, choose Remove File to remove Form1.
-
-
- 3. From the File menu, choose Add File... to and add VERINFO.BAS
-
-
- 4. Repeat step 3 to add VERINFO1.FRM and VERINFO2.FRM to the project.
-
-
- 5. From the Options menu, choose Project... and set Start Up Form
- to Form1.
-
-
- 6. Run the application.
-
-
- Additional reference words: 2.00 3.00 codesmpl
- KBCategory: APrg
- KBSubCategory: APrgWindow
-
-
- COPYRIGHT Microsoft Corporation, 1994.
-